map/mapError
map
操作符會執行給定的閉包,將上游發布的內容進行轉換,然後再發送給下游訂閱者,mapError
則將錯誤轉換為另外一種錯誤類型
[1, 2].publisher
.map { $0.description + "test" }
.sink(receiveValue: { value in
print(value)
})
flatMap
flatMap
操作符會轉換上游發布者發送的所有的元素,然後返回一個新的或者已有的發布者。
flatMap
會將所有返回的發布者的輸出合併到一個輸出流中。我們可以通過 flatMap
操作符的 maxPublishers
參數指定返回的發布者的最大數量
class TestObservableObject: ObservableObject {
var cancellable: AnyCancellable?
struct Student: Decodable {
let name: String
}
let json = """
[{
"name": "Ryder"
},
{
"name": "Jason"
},
{
"name": "Ray"
}]
"""
init() {
let publisher = PassthroughSubject<String, Never>()
cancellable = publisher
.flatMap { value in
Just(value.data(using: .utf8)!)
.decode(type: [Student].self, decoder: JSONDecoder())
.catch { _ in
Just([Student(name: "errorName")])
}
}
.sink(receiveCompletion: { _ in
print("finished")
}, receiveValue: { someValue in
print(someValue)
})
publisher.send(json)
}
}
因為flatMap
閉包要求的返回值必須是一個publisher,所以在上邊的程式碼中,我們使用了Just
,它把 json資料對映成陣列。
在上邊的catch
中也用到了Just
,目的是當發生錯誤時,返回一個預設的值,值得注意的是,catch
同樣要求返回一個publsiher
scan
scan
將收到的值與當前的值,按照給定的closure 進行轉換
(1...3).publisher
.scan(3, +)
.sink(receiveValue: { value in
print(value)
})
/*印出
4
6
9
*/